home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
bldlib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-18
|
6KB
|
144 lines
/**************************************************************************/
/* Copyright (c) 1989 by Daniel R. Zemke -- CompuServe [73230,1543] */
/* */
/* Purpose: Creates one or more libraries from all "*.c" files */
/* in the current directory. */
/* */
/* Example: Executing buildlib mylib scl */
/* */
/* Creates: mylibS.lib, mylibC.lib AND mylibL.lib */
/* (i.e. small, compact and large library versions of MYLIB) */
/* */
/* Parameters: Two and only two parameters are required. The first is */
/* used to specify the common name prefix for the series */
/* of generated libraries. The second parameter is a char */
/* string of one or more characters indicating desired */
/* memory models. Each library name is formed by suffixing */
/* the library series name with a character from the memory */
/* model list. The memory model list consists of */
/* contiguous characters without any surrounding quotes. */
/* Valid characters for the memory model list are : */
/* t s m c l h */
/* */
/* Assumptions: Turbo C for compile of source and DOS 2+ for execution. */
/* TCC and TLIB are in the current search path. */
/* Every "*.c" file in the current directory is to be */
/* included in target lib(s). */
/* Adequate memory to invoke tcc from within BUILDLIB */
/* using the system() call. */
/**************************************************************************/
#include <dir.h>
#include <process.h>
#include <stdio.h>
#include <string.h>
#define MAX_LIBNAME_CHARS 7
#define MAX_CMD_SIZE 255
void add_obj(char *lib_add_cmd, char *obj_name)
/*********************************************************/
/* Adds "obj_name" to lib and then deletes the original. */
/*********************************************************/
{
char cmd[MAX_CMD_SIZE];
sprintf(cmd,"%s%s",lib_add_cmd,obj_name);
system(cmd);
sprintf(cmd,"del %s",obj_name);
system(cmd);
}
void create_lib(char *lib_name)
/**********************************************************************/
/* Creates a library out of all object files in the current directory */
/**********************************************************************/
{
char cmd[MAX_CMD_SIZE];
struct ffblk dos_fcb;
if ( findfirst("*.obj",&dos_fcb,0) == 0) {
sprintf(cmd,"del %s.lib",lib_name); /*Attempt delete "lib_name.lib"*/
system(cmd);
/* Create lib from "*.obj" in current directory */
sprintf(cmd,"tlib %s /E +",lib_name);
add_obj(cmd,dos_fcb.ff_name);
while(findnext(&dos_fcb) == 0)
add_obj(cmd,dos_fcb.ff_name);
}
/* Delete "lib_name.bak" created by using "/E" for extended directory */
sprintf(cmd,"del %s.bak",lib_name);
system(cmd);
}
void compile(char *lib_type)
/**********************************************************************/
/* Compiles all ".c" files in the current directory with memory model */
/* specified by "lib_type". */
/**********************************************************************/
{
static char *lib_type_pos = NULL;
#define LIB_TYPE_POS '^' /* change compile_cmd if this is changed */
static char *compile_cmd = "tcc -m^ -k- -a -c -G -O -Z -d *.c";
/***********************************************************************/
/* The above variable specifies the compile options for building libs. */
/* Note : The '^' after the "-m" is required and will be replaced by a */
/* character indicating a valid memory model during execution. */
/***********************************************************************/
if (lib_type_pos == NULL)
lib_type_pos = strchr(compile_cmd,LIB_TYPE_POS);
*lib_type_pos = *lib_type;
system(compile_cmd);
}
int chk_parms(int argc, char **argv)
/************************************************/
/* Checks that program parameters are resonable */
/************************************************/
{
if (argc != 3) {
fprintf(stderr,"2 and only 2 parameters are required\n");
fprintf(stderr," 1st parm specifies base lib_name\n");
fprintf(stderr," 2nd parm is a char list of memory models : tsmclh\n");
return(1);
}
if (strlen(argv[1]) > MAX_LIBNAME_CHARS) {
fprintf(stderr,"Length of base lib_name is too long\n");
return(1);
}
if ( strspn(argv[2],"tsmclh") != strlen(argv[2]) ) {
fprintf(stderr,"Invalid memory model specified in 2nd parm\n");
return(1);
}
return(0);
}
int main(int argc, char **argv)
{
char lib_name[MAX_LIBNAME_CHARS + 2];
char *lib_mod;
char *lib_type;
if (chk_parms(argc,argv))
return(1);
strcpy(lib_name,argv[1]);
lib_mod = lib_name + strlen(lib_name);
strcat(lib_name," ");
for (lib_type = argv[2]; *lib_type; lib_type++) {
compile(lib_type);
*lib_mod = *lib_type;
create_lib(lib_name);
}
return(0);
}